summarylogtreecommitdiffstats
path: root/repacman
blob: 724d2d9e2f1372fae799aec6bf3ab431189f25fc (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
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
#!/bin/sh

#// repacman.sh
#// (c) 2008 - gyo <gyo_at_archlinux_dot_fr>
#// license : GPL
#// description : utilitaire permettant de reconstruire le paquet d'origine d'un paquet installé à partir des informations contenus dans la base de données pacman

_prg_name="${0##*/}"
_prg_version='0.98'

# Récupération de certains paramètres de pacman.conf
eval $(sed -re '/^[[:space:]]#/d' -e '/(DBPath|CacheDir)/s:([^[:space:]]+)[[:space:]]*=[[:space:]]*([^[:space:]]+):\1="\2":p;d' /etc/pacman.conf)

PACMAN_DB_DIR=${DBPath:-'/var/lib/pacman/'}
PACMAN_CACHE_DIR=${CacheDir:-'/var/cache/pacman/pkg/'}
FILE_PREP_DIR="/tmp/${_prg_name}_$$"
CURRENT_DIR="`pwd`"

DEBUG=0

#------ function ------#

function f_generate_pkginfo {
[ -e $package_dir/desc ] || _f_missed_file desc 3

dateR=`date -R`
cat << EOF > .PKGINFO
# Generated by $_prg_name $_prg_version
# $dateR
EOF

function file_stream {
cat $package_dir/desc
[ -e $package_dir/depends ] && cat $package_dir/depends
sed -rne '/%BACKUP%/,$s/^([^[:space:]]+).*/\1/p' $package_dir/files
}
file_stream | while read; do
  case $REPLY in
    %NAME%)	  pkginfo_var='pkgname';;
    %VERSION%)	  pkginfo_var='pkgver';;
    %DESC%)	  pkginfo_var='pkgdesc';;
    %GROUPS%)	  pkginfo_var='group';;
    %URL%)	  pkginfo_var='url';;
    %LICENSE%)	  pkginfo_var='license';;
    %ARCH%)	  pkginfo_var='arch';;
    %BUILDDATE%)  pkginfo_var='builddate';;
    %PACKAGER%)	  pkginfo_var='packager';;
    %SIZE%)	  pkginfo_var='size';;
    %REPLACES%)	  pkginfo_var='replace';;
    %DEPENDS%)	  pkginfo_var='depend';;
    %CONFLICTS%)  pkginfo_var='conflict';;
    %PROVIDES%)	  pkginfo_var='provide';;
    %BACKUP%)	  pkginfo_var='backup';;
    %*%) unset pkginfo_var;;
    *)
      if [ -n "$REPLY" -a -n "$pkginfo_var" ]; then
        echo "$pkginfo_var = $REPLY" >> .PKGINFO
      fi
    ;;
  esac
done
}

function f_create_tar {
mkdir $FILE_PREP_DIR
cd $FILE_PREP_DIR
[ -e $package_dir/files ] || _f_missed_file files 2

sed -rne '/%FILES%/,/%BACKUP%/{/^(%FILES%|%BACKUP%| *)$/d;s:^:/:p}' $package_dir/files > .FILELIST

if [ -e $package_dir/install ]; then
  cd $FILE_PREP_DIR
  cp $package_dir/install .INSTALL
fi

if [ -e $package_dir/changelog ]; then
  cd $FILE_PREP_DIR
  cp $package_dir/changelog .CHANGELOG
fi

f_generate_pkginfo

bsdtar czvf $CURRENT_DIR/$pkgname_ver.pkg.tar.gz --exclude=. --exclude=.. --exclude=.FILELIST -n -T .FILELIST .*
}

function _f_missed_file {
  echo "! Fichier \"$1\" manquant" >&2
  exit $2
}

function f_help {
  cat << EOF
[ $_prg_name $_prg_version ]
  $_prg_name nom_du_paquet (ex: $_prg_name hal)
  -h : affiche cette aide
EOF
}

#------ end function ------#

#------ MAIN ------#

if [ "`id -u`" != 0 -a `type -p fakeroot` ]; then
  fakeroot -- $0 $@
  exit $?
fi

if ((!$#)); then
  echo "Erreur : pas assez d'arguments"
  echo
  f_help
  exit 1
fi

if [ "$1" = '-h' ]; then f_help; exit 0; fi

pkgname="$1"

package_dir=`echo $PACMAN_DB_DIR/local/$pkgname-[0-9]*`

if [ ! -d $package_dir ]; then
  echo "Le paquet \"$pkgname\" est inexistant dans la base !"
  exit 1
fi

pkgname_ver=${package_dir##*/}

if [ -f $PACMAN_CACHE_DIR/$pkgname_ver.pkg.tar.gz ]; then
  echo "Paquet \"$pkgname_ver.pkg.tar.gz\" déjà existant dans le répertoire de cache : $PACMAN_CACHE_DIR"

read -n 1 -p 'Continuer (o/N) ? '
case $REPLY in
  o|O) ;;
  *) echo -e '\nBye.'; exit 0;;
esac

  echo
fi

echo "- Nom complet du paquet : $pkgname_ver"
if (($DEBUG)); then
echo $package_dir
fi

read -n 1 -p 'Continuer (O/n) ? '
case $REPLY in
   n|N) echo -e '\nBye.'; exit 0;;
   *) ;;
 esac


pkgname_ver="${package_dir##*/}"

f_create_tar

if ((!$DEBUG)); then
rm -fr $FILE_PREP_DIR
fi

cd $CURRENT_DIR

echo "--> $CURRENT_DIR/$pkgname_ver.pkg.tar.gz créé !"

exit 0

#------ END MAIN ------#