Hello community,
here is the log from the commit of package obs-service-tar_scm for
openSUSE:Factory checked in at 2016-07-12 23:52:03
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/obs-service-tar_scm (Old)
and /work/SRC/openSUSE:Factory/.obs-service-tar_scm.new (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "obs-service-tar_scm"
Changes:
--------
--- /work/SRC/openSUSE:Factory/obs-service-tar_scm/obs-service-tar_scm.changes
2016-05-23 16:39:11.000000000 +0200
+++
/work/SRC/openSUSE:Factory/.obs-service-tar_scm.new/obs-service-tar_scm.changes
2016-07-12 23:52:06.000000000 +0200
@@ -1,0 +2,47 @@
+Thu Jul 7 11:32:29 UTC 2016 - [email protected]
+
+- update to official version 0.6.0
+ (latest package became official)
+
+-------------------------------------------------------------------
+Thu Jul 07 11:32:21 UTC 2016 - [email protected]
+
+- Update to version 0.6.0.1467889501.49c9462:
+ + very first obs_scm implementation
+ + allow extracting of (spec) files
+ + allow to include local changes when using "obs_scm" service via local osc
commands.
+ + make obsinfo parameter for tar service optional
+ + support filtering on creation of cpio archives
+ + - add debian provides
+ + - make cleaning message a debug message
+ + report error when specified revision got not found
+ + add snapcraft.yaml support
+ + merge upstream
+ + minor cleanup
+ + fix typo, wrong file name of new snapcraft.yaml
+ + fix some more merge regressions
+ + pep8 fixes/workarounds
+ + make yaml dependency optional for travis
+
+-------------------------------------------------------------------
+Fri Jul 01 08:12:40 UTC 2016 - [email protected]
+
+- added snapcraft support via own service
+
+-------------------------------------------------------------------
+Wed Jun 29 06:06:18 UTC 2016 - [email protected]
+
+- Update to version 0.6.0~pre.1467126663.ec976d1:
+ * Allow to manually specify a base for @TAG_OFFSET@
+ * - make cleaning message a debug message
+ * Honour "subdir" param for changesgenerate
+ * report error when specified revision got not found
+ * Extend fixture to create commits with a specific timestamp
+ * Use commit timestamp as mtime for files and directories in tarball
+ * Workaround bug in Mercurial localdate filter
+ * fix breakage from conflict of #63 and #85
+ * Provide test for git tag fetching
+ * Add ability to generate changes file when using svn
+ * add snapcraft.yaml support
+
+-------------------------------------------------------------------
Old:
----
obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab.tar.gz
New:
----
obs-service-tar_scm-0.6.0.1467889501.49c9462.tar.gz
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Other differences:
------------------
++++++ obs-service-tar_scm.spec ++++++
--- /var/tmp/diff_new_pack.dBuyoa/_old 2016-07-12 23:52:07.000000000 +0200
+++ /var/tmp/diff_new_pack.dBuyoa/_new 2016-07-12 23:52:07.000000000 +0200
@@ -20,18 +20,18 @@
%define seperate_build 0
%if "%seperate_build" == "1"
-%define version_unconverted 0.6.0~pre.1461681073.57c0bab
+%define version_unconverted 0.6.0~pre.1467360725.f4aaf50
Name: obs-service-obs_scm
%else
-%define version_unconverted 0.6.0~pre.1461681073.57c0bab
+%define version_unconverted 0.6.0~pre.1467360725.f4aaf50
Name: obs-service-%{service}
#Obsoletes: obs-service-obs_scm
Provides: obs-service-obs_scm = %version-%release
%endif
Provides: obs-service-tar = %version-%release
-Version: 0.6.0~pre.1461681073.57c0bab
+Version: 0.6.0.1467889501.49c9462
Release: 0
Summary: An OBS source service: checkout or update a tar ball from
svn/git/hg
License: GPL-2.0+
@@ -45,11 +45,16 @@
BuildRequires: git-core
BuildRequires: mercurial
BuildRequires: python >= 2.6
+BuildRequires: python-dateutil
BuildRequires: python-lxml
+BuildRequires: python-mock
+BuildRequires: python-yaml
BuildRequires: subversion
Requires: bzr
Requires: git-core
Requires: mercurial
+Requires: python-dateutil
+Requires: python-yaml
Requires: subversion
%if 0%{?suse_version} < 1315
Requires: python-argparse
++++++ _service ++++++
--- /var/tmp/diff_new_pack.dBuyoa/_old 2016-07-12 23:52:07.000000000 +0200
+++ /var/tmp/diff_new_pack.dBuyoa/_new 2016-07-12 23:52:07.000000000 +0200
@@ -1,10 +1,10 @@
<services>
<service name="tar_scm" mode="disabled">
- <param
name="url">git://github.com/adrianschroeter/obs-service-tar_scm.git</param>
+ <param name="url">git://github.com/openSUSE/obs-service-tar_scm.git</param>
<param name="scm">git</param>
<param name="exclude">.git</param>
<param name="version">git-master</param>
- <param name="versionformat">0.6.0~pre.%ct.%h</param>
+ <param name="versionformat">0.6.0.%ct.%h</param>
<param name="revision">master</param>
<param name="changesgenerate">enable</param>
</service>
++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.dBuyoa/_old 2016-07-12 23:52:07.000000000 +0200
+++ /var/tmp/diff_new_pack.dBuyoa/_new 2016-07-12 23:52:07.000000000 +0200
@@ -1,4 +1,6 @@
<servicedata>
<service name="tar_scm">
<param
name="url">git://github.com/adrianschroeter/obs-service-tar_scm.git</param>
- <param
name="changesrevision">57c0bab02cbb6090d85f05e2b06ba9b1471176d9</param></service></servicedata>
\ No newline at end of file
+ <param
name="changesrevision">f4aaf50fd98105daf0405a0d0f7824fbb723e1ac</param></service><service
name="tar_scm">
+ <param
name="url">git://github.com/openSUSE/obs-service-tar_scm.git</param>
+ <param
name="changesrevision">49c9462599650ab6a6d122b9156c732187cf99ea</param></service></servicedata>
\ No newline at end of file
++++++ obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab.tar.gz ->
obs-service-tar_scm-0.6.0.1467889501.49c9462.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/.travis.yml
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/.travis.yml
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/.travis.yml
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/.travis.yml
2016-07-07 13:32:21.000000000 +0200
@@ -5,5 +5,5 @@
before_install:
- sudo apt-get update -qq
- sudo apt-get install -qq bzr git mercurial subversion
-install: pip install pep8 lxml
+install: pip install pep8 lxml mock python-dateutil
script: make check
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/GNUmakefile
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/GNUmakefile
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/GNUmakefile
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/GNUmakefile
2016-07-07 13:32:21.000000000 +0200
@@ -55,7 +55,9 @@
install -m 0644 tar_scm.rc $(DESTDIR)$(mycfgdir)/tar_scm
ln -s tar_scm $(DESTDIR)$(mylibdir)/obs_scm
ln -s tar_scm $(DESTDIR)$(mylibdir)/tar
+ ln -s tar_scm $(DESTDIR)$(mylibdir)/snapcraft
install -m 0644 tar.service $(DESTDIR)$(mylibdir)/tar.service
+ install -m 0644 snapcraft.service
$(DESTDIR)$(mylibdir)/snapcraft.service
sed -e '/^===OBS_ONLY/,/^===/d' -e '/^===/d' tar_scm.service.in >
$(DESTDIR)$(mylibdir)/tar_scm.service
sed -e '/^===TAR_ONLY/,/^===/d' -e '/^===/d' tar_scm.service.in >
$(DESTDIR)$(mylibdir)/obs_scm.service
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/debian/control
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/debian/control
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/debian/control
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/debian/control
2016-07-07 13:32:21.000000000 +0200
@@ -2,7 +2,7 @@
Section: devel
Priority: extra
Maintainer: Daniel Gollub <[email protected]>
-Build-Depends: debhelper (>= 8.0.0), bzr, git, mercurial, pep8, python (>=
2.6), python-argparse | python (>= 2.7), python-unittest2, subversion
+Build-Depends: debhelper (>= 8.0.0), bzr, git, mercurial, pep8, python (>=
2.6), python-argparse | python (>= 2.7), python-dateutil, python-unittest2,
subversion
Standards-Version: 3.9.3
Homepage: https://github.com/openSUSE/obs-service-tar_scm
X-Python-Version: >= 2.6
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/snapcraft
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/snapcraft
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/snapcraft
1970-01-01 01:00:00.000000000 +0100
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/snapcraft 2016-07-12
23:52:07.000000000 +0200
@@ -0,0 +1 @@
+symbolic link to tar_scm.py
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/snapcraft.service
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/snapcraft.service
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/snapcraft.service
1970-01-01 01:00:00.000000000 +0100
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/snapcraft.service
2016-07-07 13:32:21.000000000 +0200
@@ -0,0 +1,4 @@
+<service name="snapcraft">
+<summary>handle sources specified in snapcraft.yaml</summary>
+ <description>This service needs to be executed to download sources
according to snapcraft.yaml file. It also patches the snapcraft tile to use
local sources during build.</description>
+</service>
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tar_scm.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tar_scm.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tar_scm.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tar_scm.py 2016-07-07
13:32:21.000000000 +0200
@@ -28,6 +28,14 @@
import sys
import tarfile
import tempfile
+import dateutil.parser
+
+try:
+ # not possible to test this on travis atm
+ import yaml
+except ImportError:
+ pass
+
from urlparse import urlparse
DEFAULT_AUTHOR = '[email protected]'
@@ -212,9 +220,11 @@
if revision is None:
revision = 'master'
+ found_revision = None
revs = [x + revision for x in ['origin/', '']]
for rev in revs:
if git_ref_exists(clone_dir, rev):
+ found_revision = True
if os.getenv('OSC_VERSION'):
stash_text = safe_run(['git', 'stash'], cwd=clone_dir)[1]
text = safe_run(['git', 'reset', '--hard', rev],
@@ -227,7 +237,8 @@
cwd=clone_dir)[1]
print text.rstrip()
break
- else:
+
+ if found_revision is None:
sys.exit('%s: No such revision' % revision)
# only update submodules if they have been enabled
@@ -262,7 +273,7 @@
}
-def _calc_dir_to_clone_to(scm, url, out_dir):
+def _calc_dir_to_clone_to(scm, url, prefix, out_dir):
# separate path from parameters etc.
url_path = urlparse(url)[2].rstrip('/')
@@ -273,13 +284,17 @@
url_path = url_path.rstrip('/')
basename = os.path.basename(os.path.normpath(url_path))
+ basename = prefix + basename
clone_dir = os.path.abspath(os.path.join(out_dir, basename))
return clone_dir
def fetch_upstream(scm, url, revision, out_dir, **kwargs):
"""Fetch sources from repository and checkout given revision."""
- clone_dir = _calc_dir_to_clone_to(scm, url, out_dir)
+ clone_prefix = ""
+ if 'clone_prefix' in kwargs:
+ clone_prefix = kwargs['clone_prefix']
+ clone_dir = _calc_dir_to_clone_to(scm, url, clone_prefix, out_dir)
if not os.path.isdir(clone_dir):
# initial clone
@@ -347,7 +362,6 @@
"""
(workdir, topdir) = os.path.split(repodir)
extension = 'obscpio'
- excludes = args.exclude
cwd = os.getcwd()
os.chdir(workdir)
@@ -361,7 +375,7 @@
# transform glob patterns to regular expressions
includes = r'|'.join([fnmatch.translate(x) for x in args.include])
- excludes = r'|'.join([fnmatch.translate(x) for x in excludes]) or r'$.'
+ excludes = r'|'.join([fnmatch.translate(x) for x in args.exclude]) or r'$.'
# add topdir without filtering for now
for root, dirs, files in os.walk(topdir, topdown=False):
@@ -386,7 +400,7 @@
ret_code = proc.wait()
if ret_code != 0:
sys.exit("creating the cpio archive failed!")
- archivefile.flush()
+ archivefile.close()
# write meta data
metafile = open(os.path.join(args.outdir, basename + '.obsinfo'), "w")
@@ -395,13 +409,13 @@
# metafile.write("git describe: " + + "\n")
if commit:
metafile.write("commit: " + commit + "\n")
- metafile.flush()
+ metafile.close()
os.chdir(cwd)
def create_tar(repodir, outdir, dstname, extension='tar',
- exclude=[], include=[], package_metadata=False):
+ exclude=[], include=[], package_metadata=False, timestamp=0):
"""Create a tarball of repodir in destination directory."""
(workdir, topdir) = os.path.split(repodir)
@@ -439,6 +453,7 @@
"""Python 2.7 only: reset uid/gid to 0/0 (root)."""
tarinfo.uid = tarinfo.gid = 0
tarinfo.uname = tarinfo.gname = "root"
+ tarinfo.mtime = timestamp
return tarinfo
def tar_filter(tarinfo):
@@ -472,7 +487,7 @@
def cleanup(dirs):
"""Cleaning temporary directories."""
- logging.info("Cleaning: %s", ' '.join(dirs))
+ logging.debug("Cleaning: %s", ' '.join(dirs))
for d in dirs:
if not os.path.exists(d):
@@ -513,22 +528,24 @@
def detect_version_tar(args, repodir):
"""Read former stored version."""
- return read_from_obsinfo(args.obsinfo, "version")
+ return read_from_obsinfo(args['obsinfo'], "version")
def detect_version_git(args, repodir):
"""Automatic detection of version number for checked-out GIT repository."""
- versionformat = args.versionformat
+ parent_tag = args['parent_tag']
+ versionformat = args['versionformat']
if versionformat is None:
versionformat = '%ct.%h'
- parent_tag = None
- if re.match('.*@PARENT_TAG@.*', versionformat):
+ if not parent_tag:
rc, output = run_cmd(['git', 'describe', '--tags', '--abbrev=0'],
repodir)
- if not rc:
+ if rc == 0:
# strip to remove newlines
parent_tag = output.strip()
+ if re.match('.*@PARENT_TAG@.*', versionformat):
+ if parent_tag:
versionformat = re.sub('@PARENT_TAG@', parent_tag, versionformat)
else:
sys.exit("\033[31mNo parent tag present for the checked out "
@@ -543,10 +560,11 @@
versionformat = re.sub('@TAG_OFFSET@', tag_offset,
versionformat)
else:
- sys.exit(r'@TAG_OFFSET@ can not be expanded')
+ sys.exit("\033[31m@TAG_OFFSET@ can not be expanded: " +
+ output + "\033[0m")
else:
sys.exit("\033[31m@TAG_OFFSET@ cannot be expanded, "
- "@PARENT_TAG@ is required.\033[0m")
+ "as no parent tag was discovered.\033[0m")
version = safe_run(['git', 'log', '-n1', '--date=short',
"--pretty=format:%s" % versionformat], repodir)[1]
@@ -555,7 +573,7 @@
def detect_version_svn(args, repodir):
"""Automatic detection of version number for checked-out SVN repository."""
- versionformat = args.versionformat
+ versionformat = args['versionformat']
if versionformat is None:
versionformat = '%r'
@@ -570,7 +588,8 @@
def detect_version_hg(args, repodir):
"""Automatic detection of version number for checked-out HG repository."""
- versionformat = args.versionformat
+ parent_tag = args['parent_tag']
+ versionformat = args['versionformat']
if versionformat is None:
versionformat = '{rev}'
@@ -609,7 +628,7 @@
def detect_version_bzr(args, repodir):
"""Automatic detection of version number for checked-out BZR repository."""
- versionformat = args.versionformat
+ versionformat = args['versionformat']
if versionformat is None:
versionformat = '%r'
@@ -624,14 +643,71 @@
'svn': detect_version_svn,
'hg': detect_version_hg,
'bzr': detect_version_bzr,
- 'tar': detect_version_tar,
+ 'tar': detect_version_tar
}
- version = detect_version_commands[args.scm](args, repodir).strip()
+ version = detect_version_commands[args.scm](args.__dict__, repodir).strip()
logging.debug("VERSION(auto): %s", version)
return version
+def get_timestamp_tar(repodir):
+ return int(0)
+
+
+def get_timestamp_bzr(repodir):
+ log = safe_run(['bzr', 'log', '--limit=1', '--log-format=long'],
+ repodir)[1]
+ match = re.search(r'timestamp:(.*)', log, re.MULTILINE)
+ if not match:
+ return 0
+ timestamp = dateutil.parser.parse(match.group(1).strip()).strftime("%s")
+ return int(timestamp)
+
+
+def get_timestamp_git(repodir):
+ d = {"parent_tag": None, "versionformat": "%ct"}
+ timestamp = detect_version_git(d, repodir)
+ return int(timestamp)
+
+
+def get_timestamp_hg(repodir):
+ d = {"parent_tag": None, "versionformat": "{date}"}
+ timestamp = detect_version_hg(d, repodir)
+ timestamp = re.sub(r'([0-9]+)\..*', r'\1', timestamp)
+ return int(timestamp)
+
+
+def get_timestamp_svn(repodir):
+ svn_info = safe_run(['svn', 'info', '-rHEAD'], repodir)[1]
+
+ match = re.search('Last Changed Date: (.*)', svn_info, re.MULTILINE)
+ if not match:
+ return 0
+
+ timestamp = match.group(1).strip()
+ timestamp = re.sub('\(.*\)', '', timestamp)
+ timestamp = dateutil.parser.parse(timestamp).strftime("%s")
+ return int(timestamp)
+
+
+def get_timestamp(args, clone_dir):
+ """Returns the commit timestamp for checked-out repository."""
+ get_timestamp_commands = {
+ 'git': get_timestamp_git,
+ 'svn': get_timestamp_svn,
+ 'hg': get_timestamp_hg,
+ 'bzr': get_timestamp_bzr,
+ 'tar': get_timestamp_tar
+ }
+
+ timestamp = get_timestamp_commands[args.scm](clone_dir)
+ logging.debug("COMMIT TIMESTAMP: %s (%s)", timestamp,
+ datetime.datetime.fromtimestamp(timestamp).strftime(
+ '%Y-%m-%d %H:%M:%S'))
+ return timestamp
+
+
def get_repocache_hash(scm, url, subdir):
"""Calculate hash fingerprint for repository cache."""
digest = hashlib.new('sha256')
@@ -834,33 +910,98 @@
shutil.move(tmp_fp.name, changes_filename)
-def detect_changes_commands_git(repodir, changes):
+def _git_log_cmd(cmd_args, repodir, subdir):
+ """ Helper function to call 'git log' with args"""
+ cmd = ['git', 'log'] + cmd_args
+ if subdir:
+ cmd += ['--', subdir]
+ return safe_run(cmd, cwd=repodir)[1]
+
+
+def detect_changes_commands_git(repodir, subdir, changes):
"""Detect changes between GIT revisions."""
last_rev = changes['revision']
if last_rev is None:
- last_rev = safe_run(['git', 'log', '-n1', '--pretty=format:%H',
- '--skip=10'], cwd=repodir)[1]
- current_rev = safe_run(['git', 'log', '-n1', '--pretty=format:%H'],
- cwd=repodir)[1]
+ last_rev = _git_log_cmd(['-n1', '--pretty=format:%H', '--skip=10'],
+ repodir, subdir)
+ current_rev = _git_log_cmd(['-n1', '--pretty=format:%H'], repodir, subdir)
if last_rev == current_rev:
logging.debug("No new commits, skipping changes file generation")
return
- logging.debug("Generating changes between %s and %s", last_rev,
- current_rev)
+ dbg_msg = "Generating changes between %s and %s" % (last_rev, current_rev)
+ if subdir:
+ dbg_msg += " (for subdir: %s)" % (subdir)
+ logging.debug(dbg_msg)
- lines = safe_run(['git', 'log',
- '--reverse', '--no-merges', '--pretty=format:%s',
- "%s..%s" % (last_rev, current_rev)], repodir)[1]
+ lines = _git_log_cmd(['--reverse', '--no-merges', '--pretty=format:%s',
+ "%s..%s" % (last_rev, current_rev)], repodir, subdir)
changes['revision'] = current_rev
changes['lines'] = lines.split('\n')
return changes
-def detect_changes(scm, url, repodir, outdir):
+def detect_changes_commands_svn(repodir, subdir, changes):
+ """Detect changes between GIT revisions."""
+ last_rev = changes['revision']
+ first_run = False
+ if subdir:
+ repodir = os.path.join(repodir, subdir)
+
+ if last_rev is None:
+ last_rev = get_svn_rev(repodir, 10)
+ logging.debug("First run get log for initial release")
+ first_run = True
+
+ current_rev = get_svn_rev(repodir, 1)
+
+ if last_rev == current_rev:
+ logging.debug("No new commits, skipping changes file generation")
+ return
+
+ if not first_run:
+ # Increase last_rev by 1 so we dont get duplication of log messages
+ last_rev = int(last_rev) + 1
+
+ logging.debug("Generating changes between %s and %s", last_rev,
+ current_rev)
+ lines = get_svn_log(repodir, last_rev, current_rev)
+
+ changes['revision'] = current_rev
+ changes['lines'] = lines
+ return changes
+
+
+def get_svn_log(repodir, revision1, revision2):
+ new_lines = []
+
+ xml_lines = safe_run(['svn', 'log', '-r%s:%s' % (revision1,
+ revision2), '--xml'], repodir)[1]
+ lines = re.findall(r"<msg>.*?</msg>", xml_lines, re.S)
+
+ for line in lines:
+ line = line.replace("<msg>", "").replace("</msg>", "")
+ new_lines = new_lines + line.split("\n")
+
+ return new_lines
+
+
+def get_svn_rev(repodir, num_commits):
+ revisions = safe_run(['svn', 'log', '-l%d' % num_commits, '-q',
+ '--incremental'], cwd=repodir)[1].split('\n')
+ # remove blank entry on end
+ revisions.pop()
+ # return last entry
+ revision = revisions[-1]
+ # retrieve the revision number and remove r
+ revision = re.search(r'^r[0-9]*', revision, re.M).group().replace("r", "")
+ return revision
+
+
+def detect_changes(scm, url, repodir, outdir, subdir):
"""Detect changes between revisions."""
changes = read_changes_revision(url, os.getcwd(), outdir)
@@ -868,12 +1009,13 @@
detect_changes_commands = {
'git': detect_changes_commands_git,
+ 'svn': detect_changes_commands_svn,
}
if scm not in detect_changes_commands:
sys.exit("changesgenerate not supported with %s SCM" % scm)
- changes = detect_changes_commands[scm](repodir, changes)
+ changes = detect_changes_commands[scm](repodir, subdir, changes)
logging.debug("Detected changes:\n%s" % repr(changes))
return changes
@@ -948,6 +1090,8 @@
'specified.')
parser.add_argument('--versionprefix',
help='Specify a base version as prefix.')
+ parser.add_argument('--parent-tag',
+ help='Override base commit for @TAG_OFFSET@')
parser.add_argument('--revision',
help='Specify revision to package')
parser.add_argument('--extract', action='append',
@@ -1063,6 +1207,43 @@
if sys.argv[0].endswith("tar"):
args.scm = "tar"
+ use_obs_scm = None
+ if sys.argv[0].endswith("obs_scm"):
+ use_obs_scm = True
+
+ if sys.argv[0].endswith("snapcraft"):
+ # we read the SCM config from snapcraft.yaml instead from _service file
+ f = open('snapcraft.yaml')
+ dataMap = yaml.safe_load(f)
+ f.close()
+ # run for each part an own task
+ for part in dataMap['parts'].keys():
+ args.filename = part
+ if 'source-type' not in dataMap['parts'][part].keys():
+ continue
+ pep8_1 = dataMap['parts'][part]['source-type']
+ pep8_2 = FETCH_UPSTREAM_COMMANDS.keys()
+ if pep8_1 not in pep8_2:
+ continue
+ # avoid conflicts with files
+ args.clone_prefix = "_obs_"
+ args.url = dataMap['parts'][part]['source']
+ dataMap['parts'][part]['source'] = part
+ args.scm = dataMap['parts'][part]['source-type']
+ del dataMap['parts'][part]['source-type']
+ singletask(True, args)
+
+ # write the new snapcraft.yaml file
+ # we prefix our own here to be sure to not overwrite user files, if he
+ # is using us in "disabled" mode
+ new_file = args.outdir + '/_service:snapcraft:snapcraft.yaml'
+ with open(new_file, 'w') as outfile:
+ outfile.write(yaml.dump(dataMap, default_flow_style=False))
+ else:
+ singletask(use_obs_scm, args)
+
+
+def singletask(use_obs_scm, args):
FORMAT = "%(message)s"
logging.basicConfig(format=FORMAT, stream=sys.stderr, level=logging.INFO)
if args.verbose:
@@ -1073,8 +1254,8 @@
repocachedir = get_repocachedir()
- # construct repodir (the parent directory of the checkout)
repodir = None
+ # construct repodir (the parent directory of the checkout)
if repocachedir and os.path.isdir(os.path.join(repocachedir, 'repo')):
repohash = get_repocache_hash(args.scm, args.url, args.subdir)
logging.debug("HASH: %s", repohash)
@@ -1092,7 +1273,8 @@
# special case when using osc and creating an obscpio, use current work
# directory to allow the developer to work inside of the git repo and fetch
# local changes
- if sys.argv[0].endswith("obs_scm") and os.getenv('OSC_VERSION'):
+ if sys.argv[0].endswith("snapcraft") or \
+ (use_obs_scm and os.getenv('OSC_VERSION')):
repodir = os.getcwd()
if args.scm == "tar":
@@ -1118,14 +1300,16 @@
version = get_version(args, clone_dir)
changesversion = version
- if version and not sys.argv[0].endswith("/tar"):
+ if version and not sys.argv[0].endswith("/tar") \
+ and not sys.argv[0].endswith("/snapcraft"):
dstname += '-' + version
logging.debug("DST: %s", dstname)
changes = None
if args.changesgenerate:
- changes = detect_changes(args.scm, args.url, clone_dir, args.outdir)
+ changes = detect_changes(args.scm, args.url, clone_dir, args.outdir,
+ args.subdir)
tar_dir = prep_tree_for_archive(clone_dir, args.subdir, args.outdir,
dstname=dstname)
@@ -1133,7 +1317,7 @@
extract_from_archive(tar_dir, args.extract, args.outdir)
- if sys.argv[0].endswith("obs_scm"):
+ if use_obs_scm:
commit = None
if args.scm == "git":
commit = safe_run(['git', 'rev-parse', 'HEAD'], clone_dir)[1]
@@ -1142,7 +1326,8 @@
create_tar(tar_dir, args.outdir,
dstname=dstname, extension=args.extension,
exclude=args.exclude, include=args.include,
- package_metadata=args.package_meta)
+ package_metadata=args.package_meta,
+ timestamp=get_timestamp(args, clone_dir))
if changes:
changesauthor = get_changesauthor(args)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tar_scm.service.in
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tar_scm.service.in
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tar_scm.service.in
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tar_scm.service.in
2016-07-07 13:32:21.000000000 +0200
@@ -64,6 +64,12 @@
<parameter name="versionprefix">
<description>Specify a base version as prefix.</description>
</parameter>
+ <parameter name="parent-tag">
+ <description>
+ This parameter allows overriding the tag that is being used for
+ computing @TAG_OFFSET@.
+ </description>
+ </parameter>
<parameter name="revision">
<description>
Specify revision of source to check out.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/bzrfixtures.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/bzrfixtures.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/bzrfixtures.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/bzrfixtures.py
2016-07-07 13:32:21.000000000 +0200
@@ -30,3 +30,8 @@
def record_rev(self, wd, rev_num):
self.revs[rev_num] = str(rev_num)
self.scmlogs.annotate("Recorded rev %d" % rev_num)
+
+ def get_committer_date(self):
+ '''There seems to be no way to create a commit with a given timestamp
+ set for Bazar.'''
+ return ''
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/bzrtests.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/bzrtests.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/bzrtests.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/bzrtests.py
2016-07-07 13:32:21.000000000 +0200
@@ -36,3 +36,8 @@
basename = self.basename(version='foo2')
th = self.assertTarOnly(basename)
self.assertTarMemberContains(th, basename + '/a', '2')
+
+ def assertDirentsMtime(self, entries):
+ '''Skip this test with bazaar because there seem to be no way to create
+ commits with a given timestamp.'''
+ return True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/fixtures.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/fixtures.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/fixtures.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/fixtures.py
2016-07-07 13:32:21.000000000 +0200
@@ -17,6 +17,9 @@
subdir2 = 'subdir2'
_next_commit_revs = {}
+ # the timestamp (in seconds since epoch ) that should be used for commits
+ COMMITTER_DATE = int(1234567890)
+
def __init__(self, container_dir, scmlogs):
self.container_dir = container_dir
self.scmlogs = scmlogs
@@ -46,7 +49,7 @@
raise NotImplementedError(
self.__class__.__name__ + " didn't implement init()")
- def create_commits(self, num_commits, wd=None):
+ def create_commits(self, num_commits, wd=None, subdir=None):
self.scmlogs.annotate("Creating %d commits ..." % num_commits)
if num_commits == 0:
return
@@ -57,7 +60,7 @@
os.chdir(wd)
for i in xrange(0, num_commits):
- new_rev = self.create_commit(wd)
+ new_rev = self.create_commit(wd, subdir=subdir)
self.record_rev(wd, new_rev)
self.scmlogs.annotate("Created %d commits; now at %s" %
@@ -71,33 +74,39 @@
self._next_commit_revs[wd] += 1
return new_rev
- def create_commit(self, wd):
+ def create_commit(self, wd, subdir=None):
new_rev = self.next_commit_rev(wd)
- newly_created = self.prep_commit(new_rev)
+ newly_created = self.prep_commit(new_rev, subdir=subdir)
self.do_commit(wd, new_rev, newly_created)
return new_rev
def do_commit(self, wd, new_rev, newly_created):
self.safe_run('add .')
- self.safe_run('commit -m%d' % new_rev)
+ date = self.get_committer_date()
+ self.safe_run('commit -m%d %s' % (new_rev, date))
+
+ def get_committer_date(self):
+ return '--date="%s"' % str(self.COMMITTER_DATE)
- def prep_commit(self, new_rev):
+ def prep_commit(self, new_rev, subdir=None):
"""
Caller should ensure correct cwd.
Returns list of newly created files.
"""
+ if not subdir:
+ subdir = self.subdir
self.scmlogs.annotate("cwd is %s" % os.getcwd())
newly_created = []
if not os.path.exists('a'):
newly_created.append('a')
- if not os.path.exists(self.subdir):
- os.mkdir(self.subdir)
+ if not os.path.exists(subdir):
+ os.mkdir(subdir)
# This will take care of adding subdir/b too
- newly_created.append(self.subdir)
+ newly_created.append(subdir)
- for fn in ('a', self.subdir + '/b'):
+ for fn in ('a', subdir + '/b'):
f = open(fn, 'w')
f.write(str(new_rev))
f.close()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/gitfixtures.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/gitfixtures.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/gitfixtures.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/gitfixtures.py
2016-07-07 13:32:21.000000000 +0200
@@ -26,6 +26,9 @@
self.timestamps = {}
self.sha1s = {}
+ # Force the committer timestamp to our well known default
+ os.environ["GIT_COMMITTER_DATE"] = self.get_committer_date()
+
self.create_commits(2)
def run(self, cmd):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/gitsvntests.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/gitsvntests.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/gitsvntests.py
1970-01-01 01:00:00.000000000 +0100
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/gitsvntests.py
2016-07-07 13:32:21.000000000 +0200
@@ -0,0 +1,209 @@
+#!/usr/bin/env python2
+
+import os
+import textwrap
+import re
+
+from commontests import CommonTests
+from utils import run_git, run_svn
+
+
+class GitSvnTests(CommonTests):
+
+ """Unit tests which are shared between git and svn."""
+
+ def test_changesgenerate_disabled(self):
+ self.tar_scm_std('--changesgenerate', 'disable')
+
+ def test_changesgenerate_no_servicedata(self):
+ self.tar_scm_std('--changesgenerate', 'enable')
+ self._check_servicedata()
+
+ def test_changesgenerate_corrupt_servicedata(self):
+ with open(os.path.join(self.pkgdir, '_servicedata'), 'w') as sd:
+ sd.write('this is not valid xml')
+ self.tar_scm_std('--changesgenerate', 'enable', should_succeed=False)
+
+ def test_changesgenerate_empty_servicedata_file(self):
+ sd = open(os.path.join(self.pkgdir, '_servicedata'), 'w')
+ sd.close()
+ self.tar_scm_std('--changesgenerate', 'enable')
+ self._check_servicedata()
+
+ def test_changesgenerate_empty_servicedata_element(self):
+ with open(os.path.join(self.pkgdir, '_servicedata'), 'w') as sd:
+ sd.write("<servicedata>\n</servicedata>\n")
+ self.tar_scm_std('--changesgenerate', 'enable')
+ self._check_servicedata()
+
+ def test_changesgenerate_no_changesrevision(self):
+ with open(os.path.join(self.pkgdir, '_servicedata'), 'w') as sd:
+ sd.write(textwrap.dedent("""\
+ <servicedata>
+ <service name="tar_scm">
+ <param name="url">%s</param>
+ </service>
+ </servicedata>
+ """ % self.fixtures.repo_url))
+ self.tar_scm_std('--changesgenerate', 'enable')
+ self._check_servicedata()
+
+ def _write_changes_file(self):
+ contents = textwrap.dedent("""\
+ -------------------------------------------------------------------
+ Fri Oct 3 00:17:50 BST 2014 - %s
+
+ - 2
+
+ -------------------------------------------------------------------
+ Thu Sep 18 10:27:14 BST 2014 - %s
+
+ - 1
+ """ % (self.fixtures.user_email, self.fixtures.user_email))
+ with open(os.path.join(self.pkgdir, 'pkg.changes'), 'w') as f:
+ f.write(contents)
+ return contents
+
+ def test_changesgenerate_no_change_or_changes_file(self):
+ self._write_servicedata(2)
+ self.tar_scm_std('--changesgenerate', 'enable')
+ self._check_servicedata()
+
+ def test_changesgenerate_no_change_same_changes_file(self):
+ self._write_servicedata(2)
+ orig_changes = self._write_changes_file()
+ self.tar_scm_std('--changesgenerate', 'enable')
+ self._check_servicedata()
+
+ def test_changesgenerate_new_commit_no_changes_file(self):
+ self._write_servicedata(2)
+ self.fixtures.create_commits(1)
+ self.tar_scm_std('--changesgenerate', 'enable')
+ self._check_servicedata(revision=3)
+
+ def _new_change_entry_regexp(self, author, changes):
+ return textwrap.dedent("""\
+ ^-------------------------------------------------------------------
+ \w{3} \w{3} [ \d]\d \d\d:\d\d:\d\d [A-Z]{3} 20\d\d - %s
+
+ %s
+ """) % (author, changes)
+
+ def _check_changes(self, orig_changes, expected_changes_regexp):
+ new_changes_file = os.path.join(self.outdir, 'pkg.changes')
+ self.assertTrue(os.path.exists(new_changes_file))
+ with open(new_changes_file) as f:
+ new_changes = f.read()
+ self.assertNotEqual(orig_changes, new_changes)
+ print new_changes
+ expected_changes_regexp += "(.*)"
+ self.assertRegexpMatches(new_changes, expected_changes_regexp)
+ m = re.match(expected_changes_regexp, new_changes, re.DOTALL)
+ self.assertEqual(m.group(1), orig_changes)
+
+ def test_changesgenerate_new_commit_and_changes_file(self):
+ self._test_changesgenerate_new_commit_and_changes_file(
+ self.fixtures.user_email)
+
+ def test_changesgenerate_new_commit_and_changes_file_default_author(self):
+ self._test_changesgenerate_new_commit_and_changes_file()
+
+ def _write_servicedata(self, rev):
+ with open(os.path.join(self.pkgdir, '_servicedata'), 'w') as sd:
+ sd.write(textwrap.dedent("""\
+ <servicedata>
+ <service name="tar_scm">
+ <param name="url">%s</param>
+ <param name="changesrevision">%s</param>
+ </service>
+ </servicedata>
+ """ % (self.fixtures.repo_url, self.changesrevision(rev))))
+
+ def _test_changesgenerate_new_commit_and_changes_file(self, author=None):
+ self._write_servicedata(2)
+ orig_changes = self._write_changes_file()
+ self.fixtures.create_commits(3)
+ rev = 5
+
+ tar_scm_args = self.tar_scm_args()
+
+ if author is not None:
+ tar_scm_args += ['--changesauthor', self.fixtures.user_email]
+
+ self.tar_scm_std(*tar_scm_args)
+
+ self._check_servicedata(revision=rev, expected_dirents=3)
+
+ rev = self.changesrevision(rev, abbrev=True)
+
+ expected_author = author or '[email protected]'
+ expected_changes_regexp = self._new_change_entry_regexp(
+ expected_author,
+ textwrap.dedent("""\
+ - Update to version 0.6.%s:
+ \* 3
+ \* 4
+ \* 5
+ """) % rev
+ )
+ self._check_changes(orig_changes, expected_changes_regexp)
+
+ def test_changesgenerate_new_commit_and_changes_file_no_version(self):
+ self._write_servicedata(2)
+ orig_changes = self._write_changes_file()
+ self.fixtures.create_commits(3)
+ rev = 5
+
+ tar_scm_args = [
+ '--changesgenerate', 'enable',
+ '--version', '',
+ '--changesauthor', self.fixtures.user_email
+ ]
+ self.tar_scm_std(*tar_scm_args)
+
+ self._check_servicedata(revision=rev, expected_dirents=3)
+
+ rev = self.changesrevision(rev, abbrev=True)
+ ver_regex = self.changesregex(rev)
+
+ expected_author = self.fixtures.user_email
+ expected_changes_regexp = self._new_change_entry_regexp(
+ expected_author,
+ textwrap.dedent("""\
+ - Update to version %s:
+ \* 3
+ \* 4
+ \* 5
+ """) % ver_regex
+ )
+ self._check_changes(orig_changes, expected_changes_regexp)
+
+ def test_changesgenerate_new_commit_and_changes_file_with_subdir(self):
+ self._write_servicedata(2)
+ orig_changes = self._write_changes_file()
+ self.fixtures.create_commits(3)
+ self.fixtures.create_commits(3, subdir='another_subdir')
+ rev = 8
+
+ tar_scm_args = self.tar_scm_args()
+
+ tar_scm_args += [
+ '--subdir', 'another_subdir',
+ '--changesauthor', self.fixtures.user_email,
+ ]
+
+ self.tar_scm_std(*tar_scm_args)
+
+ self._check_servicedata(revision=rev, expected_dirents=3)
+
+ expected_author = self.fixtures.user_email
+ expected_changes_regexp = self._new_change_entry_regexp(
+ expected_author,
+ textwrap.dedent("""\
+ - Update to version 0.6.%s:
+ \* 6
+ \* 7
+ \* 8
+ """) % self.changesrevision(rev, abbrev=True)
+ )
+ self._check_changes(orig_changes, expected_changes_regexp)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/gittests.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/gittests.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/gittests.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/gittests.py
2016-07-07 13:32:21.000000000 +0200
@@ -7,11 +7,12 @@
import textwrap
from githgtests import GitHgTests
+from gitsvntests import GitSvnTests
from gitfixtures import GitFixtures
from utils import run_git
-class GitTests(GitHgTests):
+class GitTests(GitHgTests, GitSvnTests):
"""Unit tests for 'tar_scm --scm git'.
@@ -64,8 +65,32 @@
def abbrev_sha1s(self, rev):
return self.sha1s(rev)[0:7]
+ def changesrevision(self, rev, abbrev=False):
+ if abbrev:
+ return self.abbrev_sha1s('tag%d' % rev)
+ return self.sha1s('tag%d' % rev)
+
+ def changesregex(self, rev):
+ return '\d{10}.%s' % rev
+
+ def tar_scm_args(self):
+ scm_args = [
+ '--changesgenerate', 'enable',
+ '--versionformat', '0.6.%h',
+ ]
+ return scm_args
+
# N.B. --versionformat gets tested thoroughly in githgtests.py
+ def test_parent_tag(self):
+ f = self.fixtures
+ f.create_commits(1)
+ base = f.get_metadata("%H")
+ f.create_commits(3)
+ self.tar_scm_std("--parent-tag", base,
+ "--versionformat", "@TAG_OFFSET@")
+ self.assertTarOnly(self.basename(version="3"))
+
def test_versionformat_parenttag(self):
# the .1 to catch newlines at the end of PARENT_TAG
self.tar_scm_std('--versionformat', "@[email protected]")
@@ -171,163 +196,16 @@
sha1 = m.group(1)
self.assertEqual(sha1, expected_sha1)
- def test_changesgenerate_disabled(self):
- self.tar_scm_std('--changesgenerate', 'disable')
-
- def test_changesgenerate_no_servicedata(self):
- self.tar_scm_std('--changesgenerate', 'enable')
- self._check_servicedata()
-
- def test_changesgenerate_corrupt_servicedata(self):
- with open(os.path.join(self.pkgdir, '_servicedata'), 'w') as sd:
- sd.write('this is not valid xml')
- self.tar_scm_std('--changesgenerate', 'enable', should_succeed=False)
-
- def test_changesgenerate_empty_servicedata_file(self):
- sd = open(os.path.join(self.pkgdir, '_servicedata'), 'w')
- sd.close()
- self.tar_scm_std('--changesgenerate', 'enable')
- self._check_servicedata()
-
- def test_changesgenerate_empty_servicedata_element(self):
- with open(os.path.join(self.pkgdir, '_servicedata'), 'w') as sd:
- sd.write("<servicedata>\n</servicedata>\n")
- self.tar_scm_std('--changesgenerate', 'enable')
- self._check_servicedata()
-
- def test_changesgenerate_no_changesrevision(self):
- with open(os.path.join(self.pkgdir, '_servicedata'), 'w') as sd:
- sd.write(textwrap.dedent("""\
- <servicedata>
- <service name="tar_scm">
- <param name="url">%s</param>
- </service>
- </servicedata>
- """ % self.fixtures.repo_url))
- self.tar_scm_std('--changesgenerate', 'enable')
- self._check_servicedata()
-
- def _write_servicedata(self, rev):
- sha1 = self.sha1s('tag%d' % rev)
- with open(os.path.join(self.pkgdir, '_servicedata'), 'w') as sd:
- sd.write(textwrap.dedent("""\
- <servicedata>
- <service name="tar_scm">
- <param name="url">%s</param>
- <param name="changesrevision">%s</param>
- </service>
- </servicedata>
- """ % (self.fixtures.repo_url, sha1)))
-
- def _write_changes_file(self):
- contents = textwrap.dedent("""\
- -------------------------------------------------------------------
- Fri Oct 3 00:17:50 BST 2014 - %s
-
- - 2
-
- -------------------------------------------------------------------
- Thu Sep 18 10:27:14 BST 2014 - %s
-
- - 1
- """ % (self.fixtures.user_email, self.fixtures.user_email))
- with open(os.path.join(self.pkgdir, 'pkg.changes'), 'w') as f:
- f.write(contents)
- return contents
-
- def test_changesgenerate_no_change_or_changes_file(self):
- self._write_servicedata(2)
- self.tar_scm_std('--changesgenerate', 'enable')
- self._check_servicedata()
-
- def test_changesgenerate_no_change_same_changes_file(self):
- self._write_servicedata(2)
- orig_changes = self._write_changes_file()
- self.tar_scm_std('--changesgenerate', 'enable')
- self._check_servicedata()
-
- def test_changesgenerate_new_commit_no_changes_file(self):
- self._write_servicedata(2)
- self.fixtures.create_commits(1)
- self.tar_scm_std('--changesgenerate', 'enable')
- self._check_servicedata(revision=3)
-
- def _test_changesgenerate_new_commit_and_changes_file(self, author=None):
- self._write_servicedata(2)
- orig_changes = self._write_changes_file()
- self.fixtures.create_commits(3)
-
- tar_scm_args = [
- '--changesgenerate', 'enable',
- '--versionformat', '0.6.%h',
- ]
- if author is not None:
- tar_scm_args += ['--changesauthor', self.fixtures.user_email]
- self.tar_scm_std(*tar_scm_args)
-
- self._check_servicedata(revision=5, expected_dirents=3)
-
- expected_author = author or '[email protected]'
- expected_changes_regexp = self._new_change_entry_regexp(
- expected_author,
- textwrap.dedent("""\
- - Update to version 0.6.%s:
- \* 3
- \* 4
- \* 5
- """) % self.abbrev_sha1s('tag5')
- )
- self._check_changes(orig_changes, expected_changes_regexp)
-
- def test_changesgenerate_new_commit_and_changes_file_no_version(self):
- self._write_servicedata(2)
- orig_changes = self._write_changes_file()
- self.fixtures.create_commits(3)
-
- tar_scm_args = [
- '--changesgenerate', 'enable',
- '--version', '',
- '--changesauthor', self.fixtures.user_email
- ]
- self.tar_scm_std(*tar_scm_args)
-
- self._check_servicedata(revision=5, expected_dirents=3)
-
- expected_author = self.fixtures.user_email
- expected_changes_regexp = self._new_change_entry_regexp(
- expected_author,
- textwrap.dedent("""\
- - Update to version \d{10}.%s:
- \* 3
- \* 4
- \* 5
- """) % self.abbrev_sha1s('tag5')
- )
- self._check_changes(orig_changes, expected_changes_regexp)
-
- def _new_change_entry_regexp(self, author, changes):
- return textwrap.dedent("""\
- ^-------------------------------------------------------------------
- \w{3} \w{3} [ \d]\d \d\d:\d\d:\d\d [A-Z]{3} 20\d\d - %s
-
- %s
- """) % (author, changes)
-
- def _check_changes(self, orig_changes, expected_changes_regexp):
- new_changes_file = os.path.join(self.outdir, 'pkg.changes')
- self.assertTrue(os.path.exists(new_changes_file))
- with open(new_changes_file) as f:
- new_changes = f.read()
- self.assertNotEqual(orig_changes, new_changes)
- print new_changes
- expected_changes_regexp += "(.*)"
- self.assertRegexpMatches(new_changes, expected_changes_regexp)
- m = re.match(expected_changes_regexp, new_changes, re.DOTALL)
- self.assertEqual(m.group(1), orig_changes)
-
- def test_changesgenerate_new_commit_and_changes_file(self):
- self._test_changesgenerate_new_commit_and_changes_file(
- self.fixtures.user_email)
+ def test_updatecache_has_tag(self):
+ fix = self.fixtures
+ fix.create_commits(2)
+ self.tar_scm_std("--revision", 'tag2',
+ "--versionformat", "@PARENT_TAG@")
+ self.assertTarOnly(self.basename(version="tag2"))
- def test_changesgenerate_new_commit_and_changes_file_default_author(self):
- self._test_changesgenerate_new_commit_and_changes_file()
+ self.scmlogs.next('prepare-branch')
+ repo_path = fix.repo_path
+ os.chdir(repo_path)
+ fix.safe_run('checkout tag2')
+ fix.create_commits(3)
+ fix.safe_run('tag -a -m some_message detached_tag')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/hgfixtures.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/hgfixtures.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/hgfixtures.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/hgfixtures.py
2016-07-07 13:32:21.000000000 +0200
@@ -53,3 +53,6 @@
self.timestamps[tag],
self.sha1s[tag])
)
+
+ def get_committer_date(self):
+ return '--date="%s"' % (str(self.COMMITTER_DATE) + " 0")
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/hgtests.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/hgtests.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/hgtests.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/hgtests.py
2016-07-07 13:32:21.000000000 +0200
@@ -1,6 +1,7 @@
#!/usr/bin/env python2
-import datetime
+from datetime import datetime
+import time
from githgtests import GitHgTests
from hgfixtures import HgFixtures
@@ -41,12 +42,25 @@
version = "%s%s" % self.timestamps(self.rev(rev))
return version.replace('-', '')
+ def current_utc_offset(self):
+ now = time.time()
+ offset = (datetime.fromtimestamp(now) -
+ datetime.utcfromtimestamp(now))
+ # since total_seconds() isn't available in python 2.6 ...
+ return ((((offset.days * 24 * 3600) + offset.seconds) * 10 ** 6) +
+ offset.microseconds + 0.0) / 10 ** 6
+
def dateYYYYMMDD(self, rev):
- dateobj = datetime.date.fromtimestamp(self.timestamps(rev)[0])
+ # mercurial has a bug in the localdate filter that makes it apply
+ # the current offset from UTC to historic timestamps for timezones
+ # that have daylight savings enabled
+ dateobj = datetime.utcfromtimestamp(self.timestamps(rev)[0] +
+ self.current_utc_offset())
return dateobj.strftime("%4Y%02m%02d")
def dateYYYYMMDDHHMMSS(self, rev):
- dateobj = datetime.datetime.fromtimestamp(self.timestamps(rev)[0])
+ dateobj = datetime.utcfromtimestamp(self.timestamps(rev)[0] +
+ self.current_utc_offset())
return dateobj.strftime("%4Y%02m%02dT%02H%02M%02S")
def test_fetch_upstream(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/svnfixtures.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/svnfixtures.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/svnfixtures.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/svnfixtures.py
2016-07-07 13:32:21.000000000 +0200
@@ -1,9 +1,11 @@
#!/usr/bin/env python2
import os
+import stat
from fixtures import Fixtures
from utils import mkfreshdir, quietrun, run_svn
+from datetime import datetime
class SvnFixtures(Fixtures):
@@ -13,8 +15,13 @@
svn tests use this class in order to have something to test against.
"""
+ SVN_COMMITTER_DATE = datetime.utcfromtimestamp(
+ Fixtures.COMMITTER_DATE).isoformat() + ".000000Z"
+
def init(self):
self.wd_path = self.container_dir + '/wd'
+ self.user_name = 'test'
+ self.user_email = '[email protected]'
self.create_repo()
self.checkout_repo()
@@ -28,6 +35,13 @@
def create_repo(self):
quietrun('svnadmin create ' + self.repo_path)
+ # allow revprop changes to explicitly set svn:date
+ hook = self.repo_path + '/hooks/pre-revprop-change'
+ f = open(hook, 'w')
+ f.write("#!/bin/sh\nexit 0;\n")
+ f.close()
+ st = os.stat(hook)
+ os.chmod(hook, st.st_mode | stat.S_IEXEC)
print "created repo", self.repo_path
def checkout_repo(self):
@@ -41,6 +55,8 @@
self.safe_run('add ' + new)
self.added[new] = True
self.safe_run('commit -m%d' % new_rev)
+ self.safe_run('propset svn:date --revprop -r HEAD %s' %
+ self.SVN_COMMITTER_DATE)
return new_rev
def get_metadata(self, formatstr):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/svntests.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/svntests.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/svntests.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/svntests.py
2016-07-07 13:32:21.000000000 +0200
@@ -1,11 +1,15 @@
#!/usr/bin/env python2
-from commontests import CommonTests
+import os
+import re
+import textwrap
+
+from gitsvntests import GitSvnTests
from svnfixtures import SvnFixtures
from utils import run_svn
-class SvnTests(CommonTests):
+class SvnTests(GitSvnTests):
"""Unit tests for 'tar_scm --scm svn'.
@@ -22,6 +26,19 @@
def default_version(self):
return self.rev(2)
+ def changesrevision(self, rev, abbrev=False):
+ return rev
+
+ def changesregex(self, rev):
+ return rev
+
+ def tar_scm_args(self):
+ scm_args = [
+ '--changesgenerate', 'enable',
+ '--versionformat', '0.6.%r',
+ ]
+ return scm_args
+
def test_versionformat_rev(self):
self.tar_scm_std('--versionformat', 'myrev%r.svn')
self.assertTarOnly(self.basename(version='myrev2.svn'))
@@ -36,3 +53,19 @@
basename = self.basename(version='foo2')
th = self.assertTarOnly(basename)
self.assertTarMemberContains(th, basename + '/a', '2')
+
+ def _check_servicedata(self, expected_dirents=2, revision=2):
+ dirents = self.assertNumDirents(self.outdir, expected_dirents)
+ self.assertTrue('_servicedata' in dirents,
+ '_servicedata in %s' % repr(dirents))
+ sd = open(os.path.join(self.outdir, '_servicedata')).read()
+ expected = """\
+ <servicedata>
+ <service name="tar_scm">
+ <param name="url">%s</param>
+ <param name="changesrevision">([0-9].*)</param>
+ </service>
+ </servicedata>""" % self.fixtures.repo_url
+ (expected, count) = re.subn('\s{2,}', '\s*', expected)
+ m = re.match(expected, sd)
+ self.assertTrue(m, "\n'%s'\n!~ /%s/" % (sd, expected))
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/testassertions.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/testassertions.py
---
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/testassertions.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/testassertions.py
2016-07-07 13:32:21.000000000 +0200
@@ -3,6 +3,7 @@
import os
from pprint import pprint, pformat
import re
+import sys
import tarfile
import unittest
@@ -65,16 +66,29 @@
self.assertEqual(expected, got, msg)
return th, tarents
+ def assertDirentsMtime(self, entries):
+ '''This test is disabled on Python 2.6 because tarfile is not able to
+ directly change the mtime for an entry in the tarball.'''
+ if sys.hexversion < 0x02070000:
+ return
+ for i in range(0, len(entries)):
+ self.assertEqual(entries[i].mtime, 1234567890)
+
+ def assertDirents(self, entries, top):
+ self.assertEqual(entries[0].name, top)
+ self.assertEqual(entries[1].name, top + '/a')
+ self.assertEqual(entries[2].name, top + '/c')
+ self.assertDirentsMtime(entries)
+
def assertSubdirDirents(self, entries, top):
self.assertEqual(entries[0].name, top)
self.assertEqual(entries[1].name, top + '/b')
+ self.assertDirentsMtime(entries)
def assertStandardTar(self, tar, top):
th, entries = self.assertNumTarEnts(tar, 5)
entries.sort(lambda x, y: cmp(x.name, y.name))
- self.assertEqual(entries[0].name, top)
- self.assertEqual(entries[1].name, top + '/a')
- self.assertEqual(entries[2].name, top + '/c')
+ self.assertDirents(entries[:3], top)
self.assertSubdirDirents(entries[3:], top + '/subdir')
return th
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn'
'--exclude=.svnignore'
old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/unittestcases.py
new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/unittestcases.py
--- old/obs-service-tar_scm-0.6.0~pre.1461681073.57c0bab/tests/unittestcases.py
2016-04-28 00:54:15.000000000 +0200
+++ new/obs-service-tar_scm-0.6.0.1467889501.49c9462/tests/unittestcases.py
2016-07-07 13:32:21.000000000 +0200
@@ -3,8 +3,10 @@
import unittest
import sys
import os
+from mock import patch
from tar_scm import _calc_dir_to_clone_to
+from tar_scm import _git_log_cmd
class UnitTestCases(unittest.TestCase):
@@ -22,5 +24,21 @@
]
for cd in clone_dirs:
- clone_dir = _calc_dir_to_clone_to(scm, cd, outdir)
+ clone_dir = _calc_dir_to_clone_to(scm, cd, "", outdir)
self.assertEqual(clone_dir, os.path.join(outdir, 'repo'))
+
+ @patch('tar_scm.safe_run')
+ def test__git_log_cmd_with_args(self, safe_run_mock):
+ new_cmd = _git_log_cmd(['-n1'], None, '')
+ safe_run_mock.assert_called_once_with(['git', 'log', '-n1'], cwd=None)
+
+ @patch('tar_scm.safe_run')
+ def test__git_log_cmd_without_args(self, safe_run_mock):
+ new_cmd = _git_log_cmd([], None, '')
+ safe_run_mock.assert_called_once_with(['git', 'log'], cwd=None)
+
+ @patch('tar_scm.safe_run')
+ def test__git_log_cmd_with_subdir(self, safe_run_mock):
+ new_cmd = _git_log_cmd(['-n1'], None, 'subdir')
+ safe_run_mock.assert_called_once_with(['git', 'log', '-n1',
+ '--', 'subdir'], cwd=None)