annotate treepkg/git.py @ 557:9824e409388b

Refactor git branching If a checkout is already available and the branch is changed in the config git command would always fail because it doesn't know the branch to track. Therefore always check if the branch is locally available and if not checkout the remote branch
author Bjoern Ricks <bricks@intevation.de>
date Fri, 02 Sep 2011 08:45:28 +0000
parents e68c07fd849a
children bee73fd5bb82
rev   line source
501
fd52f1e231ba Fix typo in a comment
Andre Heinecke <aheinecke@intevation.de>
parents: 447
diff changeset
1 # Copyright (C) 2010 by Intevation GmbH
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
2 # Authors:
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
3 # Andre Heinecke <aheinecke@intevation.de>
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
4 #
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
5 # This program is free software under the GPL (>=v2)
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
6 # Read the file COPYING coming with the software for details.
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
7
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
8 """Collection of Git utility code"""
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
9
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
10 import os
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
11 import shutil
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
12 import re
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
13 import StringIO
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
14
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
15 import run
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
16 from cmdexpand import cmdexpand
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
17 from util import extract_value_for_key
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
18
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
19
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
20 class GitError(Exception):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
21
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
22 """Base class for Git specific errors raised by TreePKG"""
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
23
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
24 class GitRepository(object):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
25
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
26 """Describes a git repository"""
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
27
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
28 def __init__(self, url, branch=None):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
29 """Initialize the git repository description
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
30 Parameters:
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
31 url -- The url of the repository
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
32
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
33 branch -- The name of the remote Branch to track
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
34 defaults to master
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
35 """
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
36 self.url = url
557
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
37 self.local_branch = "local"
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
38 self.branch = branch
557
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
39 if ":" in branch:
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
40 branches = branch.split(":")
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
41 self.local_branch = branches[0]
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
42 self.branch = branches[1]
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
43 # use master as default
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
44 if not branch:
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
45 self.branch = "master"
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
46
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
47 def checkout(self, localdir):
550
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
48 """Clones the repository at url into the localdir"""
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
49 run.call(cmdexpand("git clone -q $url $localdir", **locals()))
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
50 if branch:
557
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
51 self.checkout_branch(localdir)
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
52
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
53 def checkout_branch(self, localdir):
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
54 run.call(cmdexpand("git checkout -q --track -b $local $branch",
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
55 branch=self.branch, local=self.local_branch), cwd=localdir)
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
56
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
57
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
58 def export(self, localdir, destdir):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
59 """Exports the working copy in localdir to destdir"""
550
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
60 dest = destdir + os.sep
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
61 run.call(cmdexpand("git checkout-index -a -f --prefix=$dest", dest=dest),
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
62 cwd=localdir)
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
63
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
64 def copy(self, localdir, destdir):
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
65 """Copies the working copy to destdir (including .git dir)"""
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
66 shutils.copytree(localdir, destdir)
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
67
557
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
68 def update(self, localdir):
550
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
69 """Runs git pull on the localdir."""
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
70 run.call(cmdexpand("git pull -q"), cwd=localdir)
557
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
71 output = capture_output(cmdexpand("git branch"), cwd=localdir)
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
72 branches = output.splitlines()
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
73 cur_branch = None
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
74 all_branches = []
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
75 for tbranch in branches:
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
76 tbranch = tbranch.strip()
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
77 if tbranch.startswith("*"):
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
78 cur_branch = tbranch[2:]
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
79 tbranch = curbranch
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
80 all_branches.append(tbranch)
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
81 if not self.local_branch in all_branches:
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
82 self.checkout_branch(localdir)
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
83 # TODO: check if self.local_branch is curbranch
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
84 # doesn't hurt if a checkout is done on the current branch
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
85 if self.branch:
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
86 run.call(cmdexpand("git checkout -q $branch", branch=self.local_branch),
550
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
87 cwd=localdir)
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
88
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
89
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
90 def last_changed_revision(self, localdir):
550
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
91 """Returns the SHA1 sum of the latest commit in the working copy in localdir"""
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
92 output = run.capture_output(cmdexpand("git rev-parse HEAD"),
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
93 cwd=localdir)
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
94 if output is None:
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
95 raise GitError("Cannot determine last changed revision for %r"
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
96 % git_working_copy)
f841b369aa80 add a copy method for git
Bjoern Ricks <bricks@intevation.de>
parents: 547
diff changeset
97 return output.strip()
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
98
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
99 def check_working_copy(self, localdir):
447
1d16e4844f98 Cleanup misplaced whitespace
Andre Heinecke <aheinecke@intevation.de>
parents: 446
diff changeset
100 """FIXME STUB: Not implemented for git"""
1d16e4844f98 Cleanup misplaced whitespace
Andre Heinecke <aheinecke@intevation.de>
parents: 446
diff changeset
101 return None
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
102
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
103 class GitWorkingCopy(object):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
104
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
105 """Represents a checkout of a git repository"""
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
106
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
107 def __init__(self, repository, localdir, logger=None):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
108 """
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
109 Initialize the working copy.
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
110 Parameters:
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
111 repository -- The GitRepository instance describing the
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
112 repository
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
113 localdir -- The directory for the working copy
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
114 logger -- logging object to use for some info/debug messages
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
115 """
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
116 self.repository = repository
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
117 self.localdir = localdir
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
118 self.logger = logger
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
119
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
120 def log_info(self, *args):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
121 if self.logger is not None:
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
122 self.logger.info(*args)
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
123
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
124 def update_or_checkout(self, revision=0):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
125 """Updates the working copy or creates by checking out the repository.
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
126 Revision number included for compatibility
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
127 """
509
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
128 gitdir = os.path.join(self.localdir, ".git")
545
991bc01ae668 log used git repo and branch
Bjoern Ricks <bricks@intevation.de>
parents: 541
diff changeset
129 branch = self.repository.branch
509
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
130 if os.path.exists(gitdir):
545
991bc01ae668 log used git repo and branch
Bjoern Ricks <bricks@intevation.de>
parents: 541
diff changeset
131 self.log_info("Updating the working copy in %r for repo " \
991bc01ae668 log used git repo and branch
Bjoern Ricks <bricks@intevation.de>
parents: 541
diff changeset
132 "%s and branch %s", self.localdir,
546
149d18aca4f7 fix variable name
Bjoern Ricks <bricks@intevation.de>
parents: 545
diff changeset
133 self.repository.url,
545
991bc01ae668 log used git repo and branch
Bjoern Ricks <bricks@intevation.de>
parents: 541
diff changeset
134 branch)
557
9824e409388b Refactor git branching
Bjoern Ricks <bricks@intevation.de>
parents: 552
diff changeset
135 self.repository.update(self.localdir)
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
136 else:
519
0365b2c7ac00 don't checkout master branch by default for local branch. local would point to the local master and not to origin/master.
Bjoern Ricks <bricks@intevation.de>
parents: 509
diff changeset
137 # TODO: better check if localdir contains files
520
5802cec2b071 fixed typo
Bjoern Ricks <bricks@intevation.de>
parents: 519
diff changeset
138 if os.path.exists(self.localdir):
519
0365b2c7ac00 don't checkout master branch by default for local branch. local would point to the local master and not to origin/master.
Bjoern Ricks <bricks@intevation.de>
parents: 509
diff changeset
139 raise GitError("Working copy dir %s already exists. " \
0365b2c7ac00 don't checkout master branch by default for local branch. local would point to the local master and not to origin/master.
Bjoern Ricks <bricks@intevation.de>
parents: 509
diff changeset
140 " files. Can't checkout from %s" % (self.localdir,
0365b2c7ac00 don't checkout master branch by default for local branch. local would point to the local master and not to origin/master.
Bjoern Ricks <bricks@intevation.de>
parents: 509
diff changeset
141 self.repository.url))
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
142 self.log_info("The working copy in %r doesn't exist yet."
545
991bc01ae668 log used git repo and branch
Bjoern Ricks <bricks@intevation.de>
parents: 541
diff changeset
143 " Checking out branch %s from %r",
991bc01ae668 log used git repo and branch
Bjoern Ricks <bricks@intevation.de>
parents: 541
diff changeset
144 self.localdir, branch, self.repository.url)
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
145 self.repository.checkout(self.localdir)
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
146
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
147 def export(self, destdir):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
148 """Exports the working copy to destdir"""
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
149 self.repository.export(self.localdir, destdir)
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
150
527
8138df69a32e implement export_tag for git working copy
Bjoern Ricks <bricks@intevation.de>
parents: 526
diff changeset
151 def export_tag(self, url, destdir, revision=None):
8138df69a32e implement export_tag for git working copy
Bjoern Ricks <bricks@intevation.de>
parents: 526
diff changeset
152 """Export tag to destir """
8138df69a32e implement export_tag for git working copy
Bjoern Ricks <bricks@intevation.de>
parents: 526
diff changeset
153 self.export(destdir)
8138df69a32e implement export_tag for git working copy
Bjoern Ricks <bricks@intevation.de>
parents: 526
diff changeset
154
321
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
155 def last_changed_revision(self):
092925ff75d7 Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff changeset
156 """Returns the last changed rev of the working copy"""
541
8b49548aa8d4 provide stubs for short_revision number
Bjoern Ricks <bricks@intevation.de>
parents: 531
diff changeset
157 return self.get_revision()
508
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
158
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
159 def list_tags(self, pattern):
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
160 output = run.capture_output(cmdexpand("git tag -l $pattern",
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
161 pattern=pattern), cwd=self.localdir)
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
162 return output.splitlines()
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
163
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
164 def get_revision(self, refname="HEAD"):
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
165 """Return the SHA1 sum of the latest commit"""
509
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
166 output = run.capture_output(cmdexpand("git rev-parse $refname",
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
167 refname=refname), cwd=self.localdir)
508
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
168 if output is None:
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
169 raise GitError("Cannot determine revision for %r"
509
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
170 % self.localdir)
508
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
171 return output.strip()
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
172
541
8b49548aa8d4 provide stubs for short_revision number
Bjoern Ricks <bricks@intevation.de>
parents: 531
diff changeset
173 def get_short_revision(self, refname="HEAD"):
8b49548aa8d4 provide stubs for short_revision number
Bjoern Ricks <bricks@intevation.de>
parents: 531
diff changeset
174 """Return the short SHA1 sum of the latest commit"""
8b49548aa8d4 provide stubs for short_revision number
Bjoern Ricks <bricks@intevation.de>
parents: 531
diff changeset
175 revision = self.get_revision(refname)
8b49548aa8d4 provide stubs for short_revision number
Bjoern Ricks <bricks@intevation.de>
parents: 531
diff changeset
176 return revision[:7]
8b49548aa8d4 provide stubs for short_revision number
Bjoern Ricks <bricks@intevation.de>
parents: 531
diff changeset
177
508
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
178 class TagDetector:
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
179
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
180 """Class to detect tags from a git repository
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
181
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
182 The tags are found using the parameters:
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
183 url -- The url of the git repository to use
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
184 pattern -- A regular expression matching the tags
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
185 """
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
186
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
187 def __init__(self, url, pattern, localdir):
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
188 self.url = url
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
189 self.pattern = pattern
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
190 repo = GitRepository(url)
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
191 self.workingcopy = GitWorkingCopy(repo, localdir)
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
192
509
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
193 def list_tags(self):
508
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
194 self.workingcopy.update_or_checkout()
509
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
195 tags = self.workingcopy.list_tags(self.pattern)
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
196 return sorted(tags)
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
197
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
198 def newest_tag_revision(self):
c4288095887f update git tag detector and add test
Bjoern Ricks <bricks@intevation.de>
parents: 508
diff changeset
199 candidates = self.list_tags()
508
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
200 urlrev = (None, None)
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
201 if candidates:
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
202 newest = candidates[-1]
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
203 try:
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
204 rev = self.workingcopy.get_revision(newest)
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
205 urlrev = (newest, rev)
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
206 except GitError:
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
207 pass
29f6d1f5cc53 add a tag detector for git
Bjoern Ricks <bricks@intevation.de>
parents: 501
diff changeset
208 return urlrev
525
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
209
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
210 def tag_pkg_parameters(self, tag_name):
526
4a56ebc53ada tag_pkg_parameters is also used in enterprise tags recipe
Bjoern Ricks <bricks@intevation.de>
parents: 525
diff changeset
211 # FIXME: Don't hardcore regex
525
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
212 #match = re.search(r"enterprise[^.]*\.[^.]*\."
531
b5e0c81c9bcc update regex for tag name schema
Bjoern Ricks <bricks@intevation.de>
parents: 527
diff changeset
213 match = re.search(r"enterprise[^.]*\.[^.]*"
525
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
214 r"(?P<date>[0-9]{8})",
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
215 tag_name)
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
216 if match:
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
217 date = match.group("date")
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
218 return (date, 1)
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
219 else:
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
220 raise GitError("Cannot determine tag parameters from %s"
e73a4bbc35e7 tag_pkg_parameters depends on scm therefore move this method to the
Bjoern Ricks <bricks@intevation.de>
parents: 520
diff changeset
221 % tag_name)
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)