summaryrefslogtreecommitdiff
path: root/scripts/xdt-commit
blob: a6605940dd5438948d42dac3881c95f159b066f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
#!/bin/bash
#
# Copyright (c) 2007-2008
#         The Xfce development team. All rights reserved.
#
# Written for Xfce by Jannis Pohlmann <jannis@xfce.org>.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License along
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
#
# xdt-commit - Part of the Xfce developer tools.
#


##
## Check what kind of repo we have
##
if [ -d .git ]; then
  repo_type=git
elif [ -d .svn ]; then
  repo_type=svn
else
  echo "This doesn't appear to be the root of a versioned source tree." >&2
  exit 1
fi


##
## Check if needed tools are installed
##
if [ "$repo_type" = "git" ]; then
  if ! type git &>/dev/null; then
    echo "Git needs to be installed." >&2
    exit 1
  fi
elif [ "$repo_type" = "svn" ]; then
  if ! type svn &> /dev/null; then
    echo "Subversion needs to be installed." >&2
    exit 1
  fi

  ##
  ## Check if we are in a versioned directory
  ##
  if ! svn info &> /dev/null; then
    echo "Current working directory is not versioned." >&2
    exit 1
  fi
fi


##
## Files to be committed
##
FILES=$*


##
## Detect all ChangeLog's inside this directory by scanning it 
## recursively
##
CHANGELOGS=$(find . -type f -iname ChangeLog | sed 's:^\./::')


##
## Append parsed diff output of each ChangeLog to the commit message
##
for CHANGELOG in $CHANGELOGS; do
  # Make sure the file exists
  if [ -f "$CHANGELOG" ]; then
    if [ "$repo_type" = "svn" ]; then
      # Determine SVN status
      STATUS=$(svn status "${CHANGELOG}")
      if [ -z "$STATUS" ]; then
        STATUS='?'
      fi
    elif [ "$repo_type" = "git" ]; then
      # Determine git status, and fake it into svn-style status
      STATUS=$(git status | grep -E "(modified|new file):[[:space:]]+${CHANGELOG}")
      [ "$STATUS" ] || STATUS='?'  # signal no changes or not versioned
    fi

    # Check if file is versioned
    if [ "$STATUS" != "?" ]; then
      # Add changelog to the commit
      if [ "$repo_type" = "git" ]; then
        git add "${CHANGELOG}"
      fi

      # Parse output
      if [ "$repo_type" = "svn" ]; then
        MSG=$(svn diff "${CHANGELOG}")
      elif [ "$repo_type" = "git" ]; then
        MSG=$(git diff --cached "${CHANGELOG}")
      fi
      MSG=$(echo "$MSG" | awk '/^+\t/' | sed 's/^+//')

      # Append to commit message (and insert newline between ChangeLogs)
      if [ -z "$COMMIT_MSG" ]; then
        COMMIT_MSG="$MSG"
      else
        COMMIT_MSG=$(echo "$COMMIT_MSG"$'\n'"$MSG")
      fi
    fi
  fi
done


##
## Commit changes. If the commit message generate from the ChangeLog 
## files is empty, ask the user to enter a commit message himself
##
if [ -n "$COMMIT_MSG" ]; then
  if [ "$repo_type" = "svn" ]; then
    svn commit $FILES -m "$COMMIT_MSG"
  elif [ "$repo_type" = "git" ]; then
    git commit $FILES -m "$COMMIT_MSG"
  fi
else
  if [ "$repo_type" = "svn" ]; then
    svn commit $FILES
  elif [ "$repo_type" = "git" ]; then
    git commit $FILES
  fi
fi