Mercurial > treepkg > treepkg
annotate treepkg/git.py @ 321:092925ff75d7
Added basic Git support, configuration options:
git_url
git_branch
author | Andre Heinecke <aheinecke@intevation.de> |
---|---|
date | Fri, 12 Mar 2010 09:13:33 +0000 |
parents | |
children | ef983263b875 |
rev | line source |
---|---|
321
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
1 # Copyright (C) 2010 by Intevation GmbHi |
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 def checkout(url, localdir, branch=None): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
25 """Clones the repository at url into the localdir""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
26 run.call(cmdexpand("git clone $url $localdir", **locals())) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
27 if branch: |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
28 run.call(cmdexpand("/bin/bash -c \"cd $localdir && git checkout --track -b local $branch\"", |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
29 **locals())) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
30 else: |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
31 run.call(cmdexpand("/bin/bash -c \"cd $localdir && git checkout --track -b local master\"", |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
32 **locals())) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
33 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
34 def update(localdir, revision=None): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
35 """Runs git pull on the localdir.""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
36 run.call(cmdexpand("/bin/bash -c \"cd $localdir && git pull -q\"", **locals())) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
37 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
38 def export(src, dest): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
39 """Exports the local branch from src to dest""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
40 run.call(cmdexpand("/bin/bash -c \"cd $src && git checkout-index -a -f --prefix=$dest\"", **locals())) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
41 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
42 def last_changed_revision(git_working_copy): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
43 """return the last changed revision of a Git branch as a incrementing Number""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
44 output = run.capture_output(cmdexpand("/bin/bash -c \"cd $git_working_copy && git rev-list local | nl | tail -n 1 | awk \'{print $$1}\'\"", **locals())) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
45 if output is None: |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
46 raise GitError("Cannot determine last changed revision for %r" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
47 % git_working_copy) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
48 return int(output) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
49 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
50 class GitRepository(object): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
51 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
52 """Describes a git repository""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
53 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
54 def __init__(self, url, branch=None): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
55 """Initialize the git repository description |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
56 Parameters: |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
57 url -- The url of the repository |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
58 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
59 branch -- The name of the remote Branch to track |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
60 defaults to master |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
61 """ |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
62 self.url = url |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
63 self.branch = branch |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
64 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
65 def checkout(self, localdir): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
66 """Checks out the repository into localdir.""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
67 checkout(self.url , localdir, self.branch) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
68 update(localdir) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
69 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
70 def export(self, localdir, destdir): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
71 """Exports the working copy in localdir to destdir""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
72 export(localdir, destdir) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
73 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
74 def last_changed_revision(self, localdir): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
75 """Returns the last changed revision of the working copy in localdir""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
76 return last_changed_revision(localdir) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
77 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
78 def check_working_copy(self, localdir): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
79 """ |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
80 FIXME STUB: Not implemented for git |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
81 """ |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
82 return None |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
83 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
84 class GitWorkingCopy(object): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
85 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
86 """Represents a checkout of a git repository""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
87 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
88 def __init__(self, repository, localdir, logger=None): |
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 Initialize the working copy. |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
91 Parameters: |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
92 repository -- The GitRepository instance describing the |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
93 repository |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
94 localdir -- The directory for the working copy |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
95 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
|
96 """ |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
97 self.repository = repository |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
98 self.localdir = localdir |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
99 self.logger = logger |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
100 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
101 def log_info(self, *args): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
102 if self.logger is not None: |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
103 self.logger.info(*args) |
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 def update_or_checkout(self, revision=0): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
106 """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
|
107 Revision number included for compatibility |
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 if os.path.exists(self.localdir): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
110 self.log_info("Updating the working copy in %r", self.localdir) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
111 update(self.localdir, self.repository.branch) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
112 else: |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
113 self.log_info("The working copy in %r doesn't exist yet." |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
114 " Checking out from %r", |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
115 self.localdir, self.repository.url) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
116 self.repository.checkout(self.localdir) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
117 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
118 def export(self, destdir): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
119 """Exports the working copy to destdir""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
120 self.repository.export(self.localdir, destdir) |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
121 |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
122 def last_changed_revision(self): |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
123 """Returns the last changed rev of the working copy""" |
092925ff75d7
Added basic Git support, configuration options:
Andre Heinecke <aheinecke@intevation.de>
parents:
diff
changeset
|
124 return self.repository.last_changed_revision(self.localdir) |