Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
A
ansible
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
OpenEdx
ansible
Commits
47cead36
Commit
47cead36
authored
Jul 30, 2012
by
Michael DeHaan
Browse files
Options
Browse Files
Download
Plain Diff
Merge pull request #727 from sfromm/git
Git module ported to use module magic
parents
d0f0315c
90bf67cf
Show whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
87 additions
and
94 deletions
+87
-94
library/git
+70
-92
test/TestRunner.py
+17
-2
No files found.
library/git
View file @
47cead36
...
...
@@ -22,59 +22,9 @@
# tag. Latest is not supported, you should not be doing
# that. Contribs welcome! -- MPD
try
:
import
json
except
ImportError
:
import
simplejson
as
json
import
os
import
re
import
sys
import
shlex
import
subprocess
import
syslog
# ===========================================
# Basic support methods
def
exit_json
(
rc
=
0
,
**
kwargs
):
print
json
.
dumps
(
kwargs
)
sys
.
exit
(
rc
)
def
fail_json
(
**
kwargs
):
kwargs
[
'failed'
]
=
True
exit_json
(
**
kwargs
)
# ===========================================
# convert arguments of form a=b c=d
# to a dictionary
# FIXME: make more idiomatic
if
len
(
sys
.
argv
)
==
1
:
fail_json
(
msg
=
"the command module requires arguments (-a)"
)
argfile
=
sys
.
argv
[
1
]
if
not
os
.
path
.
exists
(
argfile
):
fail_json
(
msg
=
"Argument file not found"
)
args
=
open
(
argfile
,
'r'
)
.
read
()
items
=
shlex
.
split
(
args
)
syslog
.
openlog
(
'ansible-
%
s'
%
os
.
path
.
basename
(
__file__
))
syslog
.
syslog
(
syslog
.
LOG_NOTICE
,
'Invoked with
%
s'
%
args
)
if
not
len
(
items
):
fail_json
(
msg
=
"the command module requires arguments (-a)"
)
params
=
{}
for
x
in
items
:
(
k
,
v
)
=
x
.
split
(
"="
)
params
[
k
]
=
v
dest
=
params
[
'dest'
]
repo
=
params
[
'repo'
]
version
=
params
.
get
(
'version'
,
'HEAD'
)
remote
=
params
.
get
(
'remote'
,
'origin'
)
# ===========================================
def
get_version
(
dest
):
''' samples the version of the git repo '''
...
...
@@ -114,44 +64,56 @@ def switchLocalBranch( branch ):
cmd
=
subprocess
.
Popen
(
cmd
,
shell
=
True
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
return
cmd
.
communicate
()
def
get_branches
(
dest
):
def
get_branches
(
module
,
dest
):
os
.
chdir
(
dest
)
branches
=
[]
cmd
=
"git branch -a"
cmd
=
subprocess
.
Popen
(
cmd
,
shell
=
True
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
out
,
err
=
cmd
.
communicate
()
if
cmd
.
returncode
!=
0
:
fail_json
(
msg
=
"Could not determine branch data - received
%
s"
%
out
)
module
.
fail_json
(
msg
=
"Could not determine branch data - received
%
s"
%
out
)
for
line
in
out
.
split
(
'
\n
'
):
branches
.
append
(
line
.
strip
())
return
branches
def
is_remote_branch
(
dest
,
remote
,
branch
):
branches
=
get_branches
(
dest
)
def
is_remote_branch
(
module
,
dest
,
remote
,
branch
):
branches
=
get_branches
(
module
,
dest
)
rbranch
=
'remotes/
%
s/
%
s'
%
(
remote
,
branch
)
if
rbranch
in
branches
:
return
True
else
:
return
False
def
is_local_branch
(
dest
,
branch
):
branches
=
get_branches
(
dest
)
def
is_local_branch
(
module
,
dest
,
branch
):
branches
=
get_branches
(
module
,
dest
)
lbranch
=
'
%
s'
%
branch
if
lbranch
in
branches
:
return
True
elif
'*
%
s'
%
branch
in
branches
:
return
True
else
:
return
False
def
pull
(
repo
,
dest
,
version
):
def
is_current_branch
(
module
,
dest
,
branch
):
branches
=
get_branches
(
module
,
dest
)
for
b
in
branches
:
if
b
.
startswith
(
'* '
):
cur_branch
=
b
if
branch
==
cur_branch
or
'*
%
s'
%
branch
==
cur_branch
:
return
True
else
:
return
True
def
pull
(
module
,
repo
,
dest
,
version
):
''' updates repo from remote sources '''
os
.
chdir
(
dest
)
branches
=
get_branches
(
dest
)
branches
=
get_branches
(
module
,
dest
)
cur_branch
=
''
for
b
in
branches
:
if
b
.
startswith
(
'* '
):
cur_branch
=
b
if
is_local_branch
(
dest
,
version
)
and
version
!=
cur_branch
:
(
out
,
err
)
=
switch
LocalBranch
(
version
)
if
is_local_branch
(
module
,
dest
,
version
)
and
not
is_current_branch
(
module
,
dest
,
version
)
:
(
out
,
err
)
=
switch
_version
(
module
,
dest
,
remote
,
version
)
cmd
=
"git pull -u origin"
cmd
=
subprocess
.
Popen
(
cmd
,
shell
=
True
,
stdout
=
subprocess
.
PIPE
,
stderr
=
subprocess
.
PIPE
)
...
...
@@ -159,12 +121,12 @@ def pull(repo, dest, version):
rc
=
cmd
.
returncode
return
(
rc
,
out
,
err
)
def
switch_version
(
dest
,
remote
,
version
):
''' once pulled, switch to a particular SHA
or tag
'''
def
switch_version
(
module
,
dest
,
remote
,
version
):
''' once pulled, switch to a particular SHA
, tag, or branch
'''
os
.
chdir
(
dest
)
cmd
=
''
if
version
!=
'HEAD'
:
if
not
is_local_branch
(
dest
,
version
)
and
is_remote_branch
(
dest
,
remote
,
version
):
if
not
is_local_branch
(
module
,
dest
,
version
)
and
is_remote_branch
(
module
,
dest
,
remote
,
version
):
cmd
=
"git checkout --track -b
%
s
%
s/
%
s"
%
(
version
,
remote
,
version
)
else
:
cmd
=
"git checkout --force
%
s"
%
version
...
...
@@ -176,45 +138,61 @@ def switch_version(dest, remote, version):
rc
=
cmd
.
returncode
return
(
rc
,
out
,
err
)
# ===========================================
gitconfig
=
os
.
path
.
join
(
dest
,
'.git'
,
'config'
)
out
,
err
,
status
=
(
None
,
None
,
None
)
# if there is no git configuration, do a clone operation
# else pull and switch the version
before
=
None
if
not
os
.
path
.
exists
(
gitconfig
):
def
main
():
module
=
AnsibleModule
(
argument_spec
=
dict
(
dest
=
dict
(
required
=
True
),
repo
=
dict
(
required
=
True
),
version
=
dict
(
default
=
'HEAD'
),
remote
=
dict
(
default
=
'origin'
)
)
)
dest
=
module
.
params
[
'dest'
]
repo
=
module
.
params
[
'repo'
]
version
=
module
.
params
[
'version'
]
remote
=
module
.
params
[
'remote'
]
gitconfig
=
os
.
path
.
join
(
dest
,
'.git'
,
'config'
)
out
,
err
,
status
=
(
None
,
None
,
None
)
# if there is no git configuration, do a clone operation
# else pull and switch the version
before
=
None
if
not
os
.
path
.
exists
(
gitconfig
):
(
rc
,
out
,
err
)
=
clone
(
repo
,
dest
)
if
rc
!=
0
:
fail_json
(
out
=
out
,
err
=
err
,
rc
=
rc
)
else
:
module
.
fail_json
(
out
=
out
,
err
=
err
,
rc
=
rc
)
else
:
# else do a pull
before
=
get_version
(
dest
)
(
rc
,
out
,
err
)
=
reset
(
dest
)
if
rc
!=
0
:
fail_json
(
out
=
out
,
err
=
err
,
rc
=
rc
)
(
rc
,
out
,
err
)
=
pull
(
repo
,
dest
,
version
)
# handle errors from clone or pull
module
.
fail_json
(
out
=
out
,
err
=
err
,
rc
=
rc
)
(
rc
,
out
,
err
)
=
pull
(
module
,
repo
,
dest
,
version
)
if
out
.
find
(
'error'
)
!=
-
1
or
err
.
find
(
'ERROR'
)
!=
-
1
:
fail_json
(
out
=
out
,
err
=
err
)
# handle errors from clone or pull
if
out
.
find
(
'error'
)
!=
-
1
or
err
.
find
(
'ERROR'
)
!=
-
1
:
module
.
fail_json
(
out
=
out
,
err
=
err
)
# switch to version specified regardless of whether
# we cloned or pulled
# switch to version specified regardless of whether
# we cloned or pulled
(
rc
,
out
,
err
)
=
switch_version
(
module
,
dest
,
remote
,
version
)
if
err
.
find
(
'error'
)
!=
-
1
:
module
.
fail_json
(
out
=
out
,
err
=
err
)
(
rc
,
out
,
err
)
=
switch_version
(
dest
,
remote
,
version
)
if
err
.
find
(
'error'
)
!=
-
1
:
fail_json
(
out
=
out
,
err
=
err
)
# determine if we changed anything
after
=
get_version
(
dest
)
changed
=
False
# determine if we changed anything
after
=
get_version
(
dest
)
changed
=
False
if
before
!=
after
:
if
before
!=
after
:
changed
=
True
exit_json
(
changed
=
changed
,
before
=
before
,
after
=
after
)
module
.
exit_json
(
changed
=
changed
,
before
=
before
,
after
=
after
)
# include magic from lib/ansible/module_common.py
#<<INCLUDE_ANSIBLE_MODULE_COMMON>>
main
()
test/TestRunner.py
View file @
47cead36
...
...
@@ -9,6 +9,7 @@ import ansible.runner
import
os
import
shutil
import
time
import
tempfile
try
:
import
json
except
:
...
...
@@ -188,8 +189,22 @@ class TestRunner(unittest.TestCase):
assert
'failed'
not
in
result
def
test_git
(
self
):
# TODO: tests for the git module
pass
if
not
get_binary
(
"yum"
):
raise
SkipTest
repo
=
'git://github.com/ansible/ansible.git'
dest
=
tempfile
.
mkdtemp
()
result
=
self
.
_run
(
'git'
,
[
'repo=
%
s'
%
repo
,
'dest=
%
s'
%
dest
])
assert
'failed'
not
in
result
result
=
self
.
_run
(
'git'
,
[
'repo=
%
s'
%
repo
,
'dest=
%
s'
%
dest
,
'version=master'
])
assert
'false'
not
in
result
try
:
shutil
.
rmtree
(
dest
)
except
OSError
,
e
:
print
"Failed to remove temp dir
%
s"
%
dest
def
test_service
(
self
):
# TODO: tests for the service module
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment