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

137

138

139

140

141

142

143

# vim: set fileencoding=utf-8 : 

# 

# (C) 2011 Guido Guenther <agx@sigxcpu.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., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA 

""" 

Someone who modifiers something in git 

 

like committing changes or authoring a patch 

""" 

 

import calendar, datetime 

 

from gbp.git.errors import GitError 

 

class GitModifierError(GitError): 

    """Exception thrown by L{GitModifier}""" 

    pass 

 

 

class GitModifier(object): 

    """Stores authorship/comitter information""" 

    def __init__(self, name=None, email=None, date=None): 

        """ 

        @param name: the modifier's name 

        @type name: C{str} 

        @param email: the modifier's email 

        @type email: C{str} 

        @param date: the date of the modification 

        @type date: C{str} (git raw date), C{int} (timestamp) or I{datetime} object 

        """ 

        self.name = name 

        self.email = email 

        self._parse_date(date) 

 

    def _parse_date(self, date): 

        self._offset = '+0000' 

        self._date = None 

 

        if isinstance(date, basestring): 

            timestamp, offset = date.split() 

            self._date = datetime.datetime.utcfromtimestamp(int(timestamp)) 

            self._offset = offset 

        elif type(date) in  [ type(0), type(0.0) ]: 

            self._date = datetime.datetime.utcfromtimestamp(date) 

        elif isinstance(date, datetime.datetime): 

            self._date = date 

        elif date != None: 

            raise ValueError("Date '%s' not timestamp, " 

                             "datetime object or git raw date" % date) 

 

    def _get_env(self, who): 

        """Get author or comitter information as env var dictionary""" 

        who = who.upper() 

        if who not in ['AUTHOR', 'COMMITTER']: 

            raise GitModifierError("Neither comitter nor author") 

 

        extra_env = {} 

        if self.name: 

            extra_env['GIT_%s_NAME' % who] = self.name 

        if self.email: 

            extra_env['GIT_%s_EMAIL' % who] = self.email 

        if self.date: 

            extra_env['GIT_%s_DATE' % who] = self.date 

        return extra_env 

 

    def get_date(self): 

        """Return date as a git raw date""" 

        if self._date: 

            return "%s %s" % (calendar.timegm(self._date.utctimetuple()), 

                              self._offset) 

        else: 

            return None 

 

    def set_date(self, date): 

        """Set date from timestamp, git raw date or datetime object""" 

        self._parse_date(date) 

 

    date = property(get_date, set_date) 

 

    @property 

    def datetime(self): 

        """Return the date as datetime object""" 

        return self._date 

 

    @property 

    def tz_offset(self): 

        """Return the date's UTC offset""" 

        return self._offset 

 

    def get_author_env(self): 

        """ 

        Get env vars for authorship information 

 

        >>> g = GitModifier("foo", "bar") 

        >>> g.get_author_env() 

        {'GIT_AUTHOR_EMAIL': 'bar', 'GIT_AUTHOR_NAME': 'foo'} 

 

        @return: Author information suitable to use as environment variables 

        @rtype: C{dict} 

        """ 

        return self._get_env('author') 

 

    def get_committer_env(self): 

        """ 

        Get env vars for comitter information 

 

        >>> g = GitModifier("foo", "bar") 

        >>> g.get_committer_env() 

        {'GIT_COMMITTER_NAME': 'foo', 'GIT_COMMITTER_EMAIL': 'bar'} 

 

        @return: Commiter information suitable to use as environment variables 

        @rtype: C{dict} 

        """ 

        return self._get_env('committer') 

 

    def __getitem__(self, key): 

        if key == 'date': 

            return self.date 

        else: 

            return self.__dict__[key] 

 

    def keys(self): 

        return [ 'name', 'email', 'date' ] 

 

    def items(self): 

        items = [] 

        for key in self.keys(): 

            val = self.__getitem__(key) 

            if val: 

                items.append((key, val)) 

        return items